#include <thread>
#include <iostream>
#include <cstring>
#include "fake.h"
#include "log.h"
#include <unistd.h>
#include <execinfo.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
#include <iostream>

int test_uintr_thread()
{
    char *shared_buffer = (char *)malloc(UM_SIZE);
    memset(shared_buffer, 0, UM_SIZE);

    std::thread t2(fake_normal, shared_buffer, thread_notify_enclave, 0);
    std::this_thread::sleep_for(std::chrono::milliseconds(1));
    std::thread t1(fake_enclave, shared_buffer, thread_notify_normal, 0);

    t1.join();
    t2.join();

    free(shared_buffer);

    LOG("SUCCESS!\n");
    return 0;
}

extern "C" int test_uintr_process();

void printStackTrace()
{
    void* array[10];
    int size = backtrace(array, 10);
    char** strings = backtrace_symbols(array, size);

    printf("Stack trace:\n");
    for (int i = 0; i < size; i++) {
        printf("%s\n", strings[i]);
    }

    free(strings);
}
void signalHandler(int signum)
{
    printStackTrace();
    // 可以在此处执行其他需要的操作，如记录日志、保存堆栈信息等
    exit(signum); // 可以选择在处理完信号后终止程序
}

void exitHandler()
{
    // 可以在此处执行其他需要的操作，如记录日志、保存堆栈信息等
    printStackTrace();
    // exit(0); // 可以选择在处理完信号后终止程序
}

int main()
{
    std::ios::sync_with_stdio(false);  // 禁用与C的标准IO库的同步，加速输入输出
    std::setvbuf(stdout, nullptr, _IONBF, 0);  // 关闭标准输出的缓存
    std::setvbuf(stderr, nullptr, _IONBF, 0);  // 关闭标准输出的缓存


    signal(SIGSEGV, signalHandler);
    atexit(exitHandler);
    // test_stress();
    // test_stress_thread();
    // test_func();
    // test_func_thread();
    
    
    LOG("MULTI THREAD TEST:\n");
    test_uintr_thread();

    LOG("MULTI PROCESS TEST:\n");
    test_uintr_process();
    return 0;
}
